_Pragma("once");


#include <string>
#include <vector>
#include <algorithm>

/**
 * 每一种设备一种类型
 */
struct ExtendDeviceType {

    //  ExtendDeviceType(const std::string& name, const int32_t type, std::initializer_list<const ExtendDeviceType*> list) : name(name), type(type), functionModule(list){}

    ExtendDeviceType() = delete;
    ExtendDeviceType(const ExtendDeviceType&) = delete;
    ExtendDeviceType(ExtendDeviceType&&) = delete;
    ExtendDeviceType& operator=(const ExtendDeviceType&) = delete;
    ExtendDeviceType& operator=(ExtendDeviceType&&) = delete;

//   typedef std::pair<ExtendDeviceType, std::string> DeviceTypeDesc;
//#define DEVICE_TYPE_AND_DESC(TYPE, VARIABLE) DeviceTypeDesc VARIABLE(TYPE, #TYPE)


    bool contains(const ExtendDeviceType& deviceType){
       return this == &deviceType || functionModule.end() != std::find(functionModule.begin(), functionModule.end(), &deviceType);
    }


    const std::string name;
    const int32_t type;
    std::vector<const ExtendDeviceType*> functionModule;
};


struct ExtendDeviceInfo{
    ExtendDeviceInfo(const std::string& name, const std::string& versionString) : name{name}, version{versionString}{
    }

std::string name;
std::string version;
};



namespace ExtendDeviceEnum {


extern const ExtendDeviceType UNKNOWN//未知设备异常
/**
 * 没有连接设备
 */
,NO_DEVICE
/**
 * GPS设备
 */
,GPS
/**
 * 开关门检测模块
 */
,DOOR_ALERTOR
/**
 * 强电回路控制模块
 * 示例: CIRCUIT_CH12 具有十二个回路的回路控制器
 */
,CIRCUIT
/**
 * 电能表模块
 */
,POWER
/**
 *  温湿度传感器
 */
,TEMPERATURE
/**
 *  空气开关
 */
,AIR
/**
 * 电压电流检测模块
 */
,ELECT
,CIRCUIT_ELEC
,EX_CIRCUIT
/**
 * DMX信号选择器
 */
,DMX_EXCHANGE
/**
 * 扫码枪
 */
,CODE_SCANNER
/**
 * 串口一转十外设
 */
,SERIAL_TRANSFORM
/**
 * 红外模块
 */
,INFRARED_MODULE
/**
 * 抄表与开关门复合模块
 */
,POWER_DOOR
/**
 * Gps 温度 光感复合模块
 */
,GPS_LUX
/**
 * Gps 温度 光感复合模块
 */
,AIR_CIRCUIT

,LUX
/**
 * 抄表与开关门复合模块
 */
,DMX_512_SWITCH
/**
 * 裕明鑫视频模块
 */
,VIDEO_CONTROLLER
,AC_SWITCH_DETECTOR
,DOOR_AC_SWITCH_DETECTOR
,EXTEND_HUB
,TOUCHPAD_CONTROLLER
,SELF;
}
